<--- %%NOBANNER%% --> sortall.sas
 BackForward

%*--------------------------------------------------------------------------------*
 | SOURCE:   sortall.sas                                                          |
 |                                                                                |
 | VERSION:  RDS v3.0                                                             |
 |                                                                                |
 | PURPOSE:  This macro sorts all input datasets by the same variables.           |
 |                                                                                |
 | SYNTAX:   %sortall (indata = _input_datasets_,                     |
 |                     by       = _sort_variable_list_,                 |
 |                     options  = _options_for_proc_sort_)              |
 *--------------------------------------------------------------------------------* ;
%macro sortall (indata=, by=, options=%str())  /des='Sorts multiple datasets' ;
   %let notes=%sysfunc(getoption(notes,keyword)) ;
   options nonotes ;
   %let starttime=%sysfunc(datetime()) ;
   %local num indata by i options data notes nvar ;

  %*----------------------*
   | initialize variables |
   *----------------------* ;

   %let indata = %cmpres(&indata) ;
   %let num      = %words(&indata) ;
   %let options  = %upcase(&options) ;
   %let by       = %upcase(&by) ;

  %*-----------------------------------------------------------*
   | grab number of obs and check number of words in &indata |
   *-----------------------------------------------------------* ;

   %if &num = 0 %then %do ;
      %let data = %data(%scan(&sysdsn, 1).%scan(&sysdsn, 2)) ;
      %let nobs = %nobs (&data) ;
      %let nvar = %nvars (&data) ;

      options ¬es ;
      %put NOTE: No datasets are specified.  The dataset &data will be used. ;
      %put NOTE: Dataset &data contains &nobs observations and &nvar variables. ;
      options nonotes ;

      proc sort data=&data &options ;
         by &by ;
      run ;
   %end ;
   %else %do i = 1 %to &num ;
      %let data = %data(%scan(&indata, &i, %str( ))) ;
      %let nobs = %nobs (&data) ;
      %let nvar = %nvars (&data) ;

      options ¬es ;
      %put NOTE: Dataset &data contains &nobs observations and &nvar variables. ;
      options nonotes ;

      proc sort data=&data &options ;
         by &by ;
      run ;
   %end ;

   options ¬es ;
   %if &options = %str() %then %put NOTE: All datasets are sorted by &by.. ;
   %else %put NOTE: All datasets are sorted by &by with options=&options.. ;
   options nonotes ;
   %timenote (macro=sortall, starttime=&starttime)
   %put ;
   options ¬es ;
%mend sortall ;